package com.office.meeting.invited.service.impl;

import com.office.common.config.FromUserEmailConfig;
import com.office.common.core.domain.entity.SysUser;
import com.office.common.utils.email.EmailAsyncWrapper;
import com.office.common.utils.email.EmailUtil;
import com.office.meeting.invited.service.InviteService;
import com.office.meeting.invited.mapper.InviteMapper;
import com.office.meeting.invited.pojo.dto.InviteDTO;
import com.office.meeting.invited.pojo.dto.InvitedDTO;
import com.office.meeting.invited.pojo.vo.InviteQueryVO;
import com.office.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;

/**
 * @author: 柒月
 * @date: 2025/5/12 下午4:22
 * @version: 1.0
 */
@Service
public class InviteServiceImpl implements InviteService {

    @Resource
    private InviteMapper inviteMapper;

    @Autowired
    private EmailAsyncWrapper emailAsyncWrapper;

    @Autowired
    private FromUserEmailConfig fromUserEmailConfig;

    /**
     * @return 查询返回当前当前登录用户被邀请人的信息
     */
    @Override
    public List<InviteDTO> getInviteAllUser() {

        // 获取当前的登录的用户的id
        Long loginUserId = SecurityUtils.getUserId();

        // 根据当前的登录用户的id查询所有没有被禁用和删除的人的信息，部门，职位

        return inviteMapper.selectAllInfo(loginUserId);
    }

    /**
     * @param inviteQuery 前端的查询条件
     * @return 返回条件查询后的用户
     */
    @Override
    public List<InviteDTO> getInviteQueryUser(InviteQueryVO inviteQuery) {
        // 获取当前的登录的用户的id
        Long loginUserId = SecurityUtils.getUserId();

        // 根据当前的登录用户的id和条件查询所有没有被禁用和删除的人的信息，部门，职位
        return inviteMapper.selectTermsUserInfo(inviteQuery, loginUserId);
    }

    /**
     * @param ids 要删除的会议的
     * @return 返回影响的行数
     */
    @Override
    public Long removeTermsByids(List<Long> ids) {
        return inviteMapper.delTermsByids(ids);
    }


    /**
     * @param invitedDTO 前端的邀请会议的数据
     * @return 返回插入的条数
     */
    @Override
    public Long addTermsAll(InvitedDTO invitedDTO) {
        // 获取当前的登录的用户的id
        Long loginUserId = SecurityUtils.getUserId();

        // 设置会议发起时间
        invitedDTO.setMeetingLaunchDate(LocalDateTime.now());

        invitedDTO.setLoginUserId(loginUserId);

        // 发送邮件异步
        extracted(invitedDTO);

        return inviteMapper.insertaddTerms(invitedDTO);
    }

    /**
     * 发送邮件函数异步发送
     *
     * @param invitedDTO 发送信息
     */
    public void extracted(InvitedDTO invitedDTO) {
        // 要发送人的邮箱集合
        List<String> emailTo = invitedDTO.getEmail();
        // 查询登录用户信息
        SysUser longinUser = inviteMapper.getLoginUserById(invitedDTO.getLoginUserId());
        // 设置邮箱标题为会议名
        String subject = invitedDTO.getMeetingName().lastIndexOf("会议") == -1 ? invitedDTO.getMeetingName() + "会议" : invitedDTO.getMeetingName();
        // 设置邮箱内容
        String text =
                longinUser.getNickName() + "发起的会议: \n"
                        + "会议名:  " + invitedDTO.getMeetingName() + "\n"
                        + "会议开始时间:  " + invitedDTO.getMeetingLaunchDate() + "\n"
                        + "会议密码:  " + invitedDTO.getPassword() + "\n"
                        + "请及时查收！";
        emailAsyncWrapper.sendBatchEmailAsync(fromUserEmailConfig.getFromUserEmail(), emailTo, subject, text);
    }
}
